package analiseSemantica.estruturadedados;

import java.util.Hashtable;

import analiseSintatica.AnalisadorSintatico;

/**
 *
 * @author amferraz
 * @param <String> uma chave atraves do qual a entrada na tabela de simbolos e identificada
 * @param <V> Value
 */
public class Escopo extends Hashtable<String, Token> {

    /**
     *
     */
    private static final long serialVersionUID = 1L;
    private Escopo parent = null;

    public Escopo(Escopo parent) {
        this.parent = parent;
    }

    public boolean isRoot() {
        return this.parent == null;
    }

    public Escopo getParent() {
        return parent;
    }

//    public boolean find(Object o){
//        Escopo temp = this;
//        while (this!=null){
//            if (temp.contains(o))
//                return true;
//            temp=temp.getParent();
//        }
//
//        return false;
//    }
    public Token find(String id) {
        Escopo temp = AnalisadorSintatico.escopoatual;
        while (temp != null) {
            if (temp.containsKey(id)) {
                return temp.get(id);
            }
            temp = temp.getParent();
        }

        return null;
    }

    /**
     * Retorna o tipo primitivo de um identificador; Se for um typedef que
     * renomeia um tipo 
     * @param identificador
     * @return
     */
//    public TipoSemantico getTipoPrimitivo(String identificador){
//        //iterar sobre uma hashtable não é trivial
//        //retirado daqui: http://www.java2s.com/Code/JavaAPI/java.util/Hashtableiterator.htm
//
//
//        Set<String> set = (Set<String>) this.keySet();
//        Iterator<String> itr = set.iterator();
//
//        while(itr.hasNext()){
//            Object linha = this.get(itr.next());
//            if (this.get(itr.next()).lexema.equals(identificador)){
//
//            }
//        }
//
//    }
}
